<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>自动柯里化函数</title>
</head>

<body>

  <script>
    // 封装函数: 自动转化柯里化过程
    function currying(fn) {
      function _currying(...args) {
        // 如果参数个数小于fn.length, 则继续递归调用
        // 1. 继续返回一个新的函数, 继续接受参数
        // 2. 直接执行fn函数
        if (args.length >= fn.length) {
          return fn.apply(this, args)
        } else { // 执行继续返回一个新的函数, 继续接受参数
          return function (...args2) {
            console.log("args.concat(args2)", args.concat(args2), args, args2);
            return _currying.apply(this, args.concat(args2))
          }
        }
      }

      return _currying
    }

    function foo(x, y, z) {
      console.log(x + y + z)
    }

    function sum(num1, num2) {
      return num1 + num2
    }

    function logInfo(date, type, message) {
      console.log(`时间:${date} 类型:${type} 内容:${message}`)
    }

    // 对其他的函数进行柯里化
    var fooCurry = currying(foo)
    fooCurry(10)(20)(30)
    fooCurry(55, 12, 56)

    var sumCurry = currying(sum)
    var sum5 = sumCurry(5)
    console.log(sum5(10))
    console.log(sum5(15))
    console.log(sum5(18))

    var logInfoCurry = currying(logInfo)
    logInfoCurry("2022-06-01")("DEBUG")("我发现一个bug, 哈哈哈哈")

    function bar(...args) {
      console.log(args)
    }

    bar([10, 10, 30, 40, 50])

  </script>

</body>

</html>